#include "../tcp_client.h" 
#include "../ui.h"
#include "../keyboard.h"
#include <string.h>

// 字体声明（根据项目实际字体修改）
LV_FONT_DECLARE(lv_font_fan_24);

// 全局UI对象
static lv_obj_t *msg_list;       // 消息列表
lv_obj_t *input_area;            // 输入框
static lv_obj_t *send_btn;       // 发送按钮
lv_obj_t *ui_Screen3;            // 聊天主屏幕
static lv_obj_t *apply_ai_btn;   // 申请人工聊天按钮

// 聊天权限标记（0=未允许，1=已允许）
static int chat_permitted = 0;

// 消息类型枚举
typedef enum {
    MSG_TYPE_USER,    // 用户发送的消息（蓝色气泡）
    MSG_TYPE_SUPPORT  // 客服/服务器消息（灰色气泡）
} MsgType;

// 函数原型声明
static void back_btn_event_handler(lv_event_t *e);
static void send_btn_event_handler(lv_event_t *e);
static void add_message_to_ui(const char *text, MsgType type);
static void check_server_msg_cb(lv_timer_t *timer);
static void apply_ai_btn_event_handler(lv_event_t *e);

// 定时器（定时检查服务器消息）
static lv_timer_t *server_msg_timer = NULL;

/**
 * 添加消息到聊天界面（气泡样式）
 */
static void add_message_to_ui(const char *text, MsgType type) {
    if (!lv_obj_is_valid(msg_list) || text == NULL) return;

    // 创建列表项
    lv_obj_t *list_btn = lv_list_add_btn(msg_list, NULL, "");
    lv_obj_set_style_pad_top(list_btn, 10, 0);
    lv_obj_set_style_pad_bottom(list_btn, 10, 0);
    lv_obj_set_height(list_btn, LV_SIZE_CONTENT);

    // 创建消息气泡
    lv_obj_t *bubble = lv_obj_create(list_btn);
    lv_obj_set_style_border_width(bubble, 0, 0);
    lv_obj_set_style_radius(bubble, 10, 0);
    lv_obj_set_width(bubble, lv_pct(70)); // 气泡宽度占列表70%
    lv_obj_set_layout(bubble, LV_LAYOUT_FLEX);
    lv_obj_set_flex_flow(bubble, LV_FLEX_FLOW_COLUMN);

    // 创建消息文本
    lv_obj_t *msg_label = lv_label_create(bubble);
    lv_label_set_text(msg_label, text);
    lv_obj_set_style_text_font(msg_label, &lv_font_fan_24, 0);
    lv_label_set_long_mode(msg_label, LV_LABEL_LONG_WRAP); // 自动换行
    lv_obj_set_width(msg_label, lv_pct(100));

    // 区分用户/服务器消息样式
    if (type == MSG_TYPE_USER) {
        lv_obj_set_style_bg_color(bubble, lv_color_hex(0x1E88E5), 0); // 蓝色
        lv_obj_set_style_text_color(msg_label, lv_color_white(), 0);   // 白色文字
        lv_obj_align(bubble, LV_ALIGN_RIGHT_MID, 0, 0);               // 右对齐
    } else {
        lv_obj_set_style_bg_color(bubble, lv_color_hex(0xF0F0F0), 0); // 浅灰色
        lv_obj_set_style_text_color(msg_label, lv_color_black(), 0);   // 黑色文字
        lv_obj_align(bubble, LV_ALIGN_LEFT_MID, 0, 0);                // 左对齐
    }

    // 滚动到最新消息
    lv_obj_scroll_to_view(list_btn, LV_ANIM_ON);
}

/**
 * 发送按钮点击事件（带权限控制）
 */
static void send_btn_event_handler(lv_event_t *e) {
    (void)e;
    // 未通过申请时，提示用户
    if (chat_permitted == 0) {
        add_message_to_ui("请先点击\"申请人工聊天\"并等待通过", MSG_TYPE_SUPPORT);
        return;
    }

    // 获取输入框内容
    const char *text = lv_textarea_get_text(input_area);
    if (text == NULL || strlen(text) == 0) return;

    // 检查连接，断开则重连
    if (client_socket == -1) {
        add_message_to_ui("连接断开，正在重试...", MSG_TYPE_SUPPORT);
        if (tcp_client_init() != 0) {
            add_message_to_ui("重连失败，无法发送", MSG_TYPE_SUPPORT);
            return;
        }
    }

    // 调用带标记的发送函数
    tcp_send_chat_msg(text);
    // 本地显示自己的消息
    add_message_to_ui(text, MSG_TYPE_USER);
    // 清空输入框
    lv_textarea_set_text(input_area, "");
}

/**
 * 申请人工聊天按钮点击事件
 */
static void apply_ai_btn_event_handler(lv_event_t *e) {
    (void)e;
    // 已通过申请，无需重复提交
    if (chat_permitted == 1) {
        add_message_to_ui("已通过人工聊天申请，可直接发送消息", MSG_TYPE_SUPPORT);
        return;
    }

    // 发送申请
    tcp_send_chat_apply();
    // 本地显示申请状态
    add_message_to_ui("已提交人工聊天申请，请等待回复...", MSG_TYPE_USER);
}

/**
 * 定时器回调：检查并显示服务器消息
 */
static void check_server_msg_cb(lv_timer_t *timer) {
    (void)timer;
    char buf[BUFFER_SIZE] = {0};

    // 检查连接，断开则定时重连
    if (client_socket == -1) {
        static uint32_t last_fail_time = 0;
        uint32_t now = lv_tick_get();
        if (now - last_fail_time > 5000) { // 5秒重连一次
            if (tcp_client_init() != 0) {
                add_message_to_ui("与服务器断开，正在重连...", MSG_TYPE_SUPPORT);
                last_fail_time = now;
                chat_permitted = 0; // 重连后重置权限
            } else {
                add_message_to_ui("重新连接服务器成功！", MSG_TYPE_SUPPORT);
            }
        }
        return;
    }

    // 循环读取消息队列中的所有服务器消息
    while (tcp_get_server_msg(buf, sizeof(buf)) == 0) {
        char *display_msg = buf;
        // 处理人工聊天申请回复
        if (strncmp(buf, "APPLY_REPLY:", 12) == 0) {
            if (strcmp(buf + 12, "yes") == 0) {
                display_msg = "人工聊天申请已通过，可开始发送消息";
                chat_permitted = 1; // 标记为已允许
                lv_obj_set_style_bg_color(send_btn, lv_color_hex(0x1E88E5), 0); // 发送按钮变蓝色
            } else if (strcmp(buf + 12, "no") == 0) {
                display_msg = "人工聊天申请未通过，请稍后再试";
                chat_permitted = 0; // 标记为未允许
                lv_obj_set_style_bg_color(send_btn, lv_color_hex(0xCCCCCC), 0); // 发送按钮变灰色
            }
        }

        // 显示服务器消息
        add_message_to_ui(display_msg, MSG_TYPE_SUPPORT);
    }
}

/**
 * 返回按钮点击事件（返回上一屏幕）
 */
static void back_btn_event_handler(lv_event_t *e) {
    (void)e;
    // 停止定时器
    if (server_msg_timer) {
        lv_timer_del(server_msg_timer);
        server_msg_timer = NULL;
    }
    // 重置权限
    chat_permitted = 0;
    // 加载上一屏幕（根据项目实际屏幕名修改）
    if (!lv_obj_is_valid(ui_Screen4)) {
        ui_Screen4_screen_init();
    }
    lv_scr_load(ui_Screen4);
}

/**
 * 初始化聊天屏幕（创建所有UI元素）
 */
void ui_Screen3_screen_init(void) {
    force_reset_keyboard();
    // 若屏幕已存在，先删除
    if (lv_obj_is_valid(ui_Screen3)) {
        lv_obj_del(ui_Screen3);
    }
    ui_Screen3 = lv_obj_create(NULL);
    lv_obj_clear_flag(ui_Screen3, LV_OBJ_FLAG_SCROLLABLE); // 禁止屏幕滚动
    lv_obj_set_style_bg_color(ui_Screen3, lv_color_hex(0xFFFFFF), 0); // 白色背景

    // 1. 标题栏
    lv_obj_t *title_label = lv_label_create(ui_Screen3);
    lv_label_set_text(title_label, "在线咨询");
    lv_obj_set_style_text_font(title_label, &lv_font_fan_24, 0);
    lv_obj_set_style_text_color(title_label, lv_color_hex(0x1E88E5), 0); // 蓝色标题
    lv_obj_align(title_label, LV_ALIGN_TOP_MID, 0, 30); // 顶部居中

    // 2. 申请人工聊天按钮（右上角）
    apply_ai_btn = lv_btn_create(ui_Screen3);
    lv_obj_set_size(apply_ai_btn, 180, 45); // 按钮大小
    lv_obj_align(apply_ai_btn, LV_ALIGN_TOP_RIGHT, -20, 20); // 右上角位置
    lv_obj_add_event_cb(apply_ai_btn, apply_ai_btn_event_handler, LV_EVENT_CLICKED, NULL);
    // 按钮文本
    lv_obj_t *apply_ai_btn_label = lv_label_create(apply_ai_btn);
    lv_label_set_text(apply_ai_btn_label, "申请人工聊天");
    lv_obj_set_style_text_font(apply_ai_btn_label, &lv_font_fan_24, 0);
    lv_obj_center(apply_ai_btn_label);

    // 3. 返回按钮（左上角）
    lv_obj_t *back_btn = lv_btn_create(ui_Screen3);
    lv_obj_set_size(back_btn, 100, 45); // 按钮大小
    lv_obj_align(back_btn, LV_ALIGN_TOP_LEFT, 20, 20); // 左上角位置
    lv_obj_add_event_cb(back_btn, back_btn_event_handler, LV_EVENT_CLICKED, NULL);
    // 按钮文本
    lv_obj_t *back_btn_label = lv_label_create(back_btn);
    lv_label_set_text(back_btn_label, "返回");
    lv_obj_set_style_text_font(back_btn_label, &lv_font_fan_24, 0);
    lv_obj_center(back_btn_label);

    // 4. 消息列表
    msg_list = lv_list_create(ui_Screen3);
    lv_obj_set_size(msg_list, lv_pct(95), lv_pct(70)); // 占屏幕95%宽、70%高
    lv_obj_align(msg_list, LV_ALIGN_TOP_MID, 0, 100); // 标题栏下方
    lv_obj_set_style_border_width(msg_list, 1, 0); // 边框宽度
    lv_obj_set_style_border_color(msg_list, lv_color_hex(0xCCCCCC), 0); // 灰色边框
    lv_obj_set_style_radius(msg_list, 5, 0); // 圆角
    lv_obj_set_scrollbar_mode(msg_list, LV_SCROLLBAR_MODE_AUTO); // 自动显示滚动条

    // 5. 输入区域（底部）
    lv_obj_t *input_cont = lv_obj_create(ui_Screen3);
    lv_obj_set_size(input_cont, lv_pct(95), 100); // 占屏幕95%宽、固定高度
    lv_obj_align(input_cont, LV_ALIGN_BOTTOM_MID, 0, -20); // 底部居中
    lv_obj_set_layout(input_cont, LV_LAYOUT_FLEX); // 弹性布局
    lv_obj_set_flex_flow(input_cont, LV_FLEX_FLOW_ROW); // 水平排列
    lv_obj_set_style_bg_opa(input_cont, LV_OPA_0, 0); // 透明背景
    lv_obj_set_style_border_width(input_cont, 0, 0); // 无边框

    // 5.1 输入框
    input_area = lv_textarea_create(input_cont);
    lv_obj_set_size(input_area, lv_pct(75), LV_SIZE_CONTENT); // 占输入区75%宽
    lv_textarea_set_placeholder_text(input_area, "请输入咨询内容..."); // 提示文本
    lv_obj_set_style_text_font(input_area, &lv_font_fan_24, 0);
    lv_obj_set_style_radius(input_area, 20, 0); // 圆角
    lv_obj_set_style_border_width(input_area, 1, 0); // 边框
    lv_obj_set_style_border_color(input_area, lv_color_hex(0xCCCCCC), 0); // 灰色边框
    lv_obj_add_event_cb(input_area, ta_event_cb, LV_EVENT_CLICKED, NULL); // 点击弹出键盘
    lv_obj_add_flag(input_area, LV_OBJ_FLAG_CLICKABLE); // 可点击

    // 5.2 发送按钮
    send_btn = lv_btn_create(input_cont);
    lv_obj_set_size(send_btn, lv_pct(20), 60); // 占输入区20%宽、固定高度
    lv_obj_set_style_bg_color(send_btn, lv_color_hex(0xCCCCCC), 0); // 初始灰色（未允许）
    lv_obj_set_style_radius(send_btn, 20, 0); // 圆角
    lv_obj_add_event_cb(send_btn, send_btn_event_handler, LV_EVENT_CLICKED, NULL);
    // 按钮文本
    lv_obj_t *send_btn_label = lv_label_create(send_btn);
    lv_label_set_text(send_btn_label, "发送");
    lv_obj_set_style_text_font(send_btn_label, &lv_font_fan_24, 0);
    lv_obj_set_style_text_color(send_btn_label, lv_color_white(), 0); // 白色文字
    lv_obj_center(send_btn_label);

    // 6. 欢迎消息
    add_message_to_ui("您好，欢迎咨询在线客服！请先申请人工聊天", MSG_TYPE_SUPPORT);

    // 7. 启动定时器（100ms检查一次服务器消息）
    if (server_msg_timer) {
        lv_timer_del(server_msg_timer);
    }
    server_msg_timer = lv_timer_create(check_server_msg_cb, 100, NULL);
}